/*
    Copyright is LuoYuShun to 2022-2022
*/
package cn.com.laya.service.fourdemo.websocket;

import cn.com.laya.service.fourdemo.bean.UserInfo;
import cn.com.laya.service.fourdemo.bean.WebSocketMessage;
import cn.com.laya.service.fourdemo.enums.MessageTypeEnum;
import cn.com.laya.service.fourdemo.utils.WebSocketUtils;
import com.alibaba.fastjson.JSON;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * 描述
 *
 * @author LuoYuShun
 * @since 2022-11-24
 */
@ServerEndpoint("/websocket/{username}/{ticket}")
@Component
@Slf4j
public class WebSocket {

    /**
     * session绘画
     */
    @Getter
    private Session session;

    /**
     * 登录的用户名称
     */
    @Getter
    private String username;

    /**
     * 组的ids列表
     */
    @Getter
    @Setter
    private List<String> groupIds = new ArrayList<>();

    /**
     * 场景号
     */
    @Getter
    @Setter
    private String scenario="00000000000000000000";

    /**
     * 凭证
     */
    @Setter
    @Getter
    private String ticket;

    /**
     * 用户的信息
     */
    @Getter
    @Setter
    private UserInfo userInfo;

    @OnOpen
    public void onOpen(@PathParam("username") String username, String ticket, Session session) {
        this.username = username;
        this.session = session;
        this.ticket = ticket;
        // 判断门禁是否通过，如果没有通过，需要发送一个不通过的信息，然后进行关闭session的信息
//        if (!isPassTicket(username, ticket)) {
//            // 进行发送信息
//            try {
//                session.close();
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//            return;
//        }
        // 这里进行添加登录信息，然后需要进行发送握手的信息，比如发送一个问候的数据，表示链接成功。
        WebSocketUtils.addClient(username, this);
        // 进行发送问候的信息
        WebSocketMessage webSocketMessage = new WebSocketMessage();
        webSocketMessage.setMsg("你好，欢迎进入虚拟空间!");
        webSocketMessage.setAccount(username);
        webSocketMessage.setMessageType(MessageTypeEnum.HELLO_MSG.getType());
        WebSocketUtils.sendMessage(JSON.toJSONString(Collections.singletonList(webSocketMessage)), this);
    }

    @OnClose
    public void onClose() {
        // 这里需要通知别人，自己已经下线的消息了
        WebSocketUtils.logout(this.username);
    }

    @OnMessage
    public void onMessage(String message, Session session) {
        // 进行对信息的解析
        WebSocketUtils.addAction(message, session);
    }

    @OnError
    public void onError(Session session, Throwable error) {
        error.printStackTrace();
    }
}
